package com.by.service.impl;

import com.by.bean.Employee;
import com.by.bean.User;
import com.by.common.crud.BaseServiceImpl;
import com.by.common.utils.AssertUtils;
import com.by.mapper.EmployeeMapper;
import com.by.mapper.UserMapper;
import com.by.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;

/**
 * @author Ye QS
 * @version 0.1
 * @className EmployeeServiceImpl
 * @description
 * @date 2024/9/11 15:01
 * @since jdk11
 */
@Service
public class EmployeeServiceImpl extends BaseServiceImpl<Employee, EmployeeMapper> implements EmployeeService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    EmployeeMapper employeeMapper;

    /**
     * 事务性方法，用于保存 Employee 实体及其关联的 User 数据。
     * <p>
     * 此方法在事务控制下运行，确保了操作的原子性和一致性。
     * 首先尝试保存 Employee 对象中的 User 数据，
     * 如果 User 成功保存，则继续保存整个 Employee 实体；
     * 否则，将抛出异常并停止后续操作。
     *
     * @param entity 要保存的 Employee 实例
     * @return 返回最终保存操作的结果状态码
     */
    @Transactional
    @Override
    public int save(Employee entity) {

        // 首先保存与 Employee 关联的 User 数据
        entity.getUser().setType(1);
        int rs = userMapper.save(entity.getUser());

        // 检查 User 是否已成功保存
        AssertUtils.isNotSuccess(rs, "用户保存失败");

        // 确认 User 已经保存成功后，再保存 Employee 数据
        return super.save(entity);
    }

    @Override
    @Transactional  // 添加事务注解
    public int delete(Serializable id) {
        Employee employee = employeeMapper.getEmployeeById(id);
        if (employee == null) {
            throw new RuntimeException("员工不存在");
        }

        User user = employee.getUser();
        if (user == null || user.getId() == null) {
            throw new RuntimeException("用户信息不完整");
        }

        Integer userId = user.getId();
        userMapper.delete(userId);  // 删除用户
        return employeeMapper.delete(employee.getId());  // 删除员工
    }

    /**
     * 前端在员工列表通过账户名重置密码
     *
     * @param user
     * @return
     */
    @Override
    public int resetPassword(User user) {
        // 查询用户信息
        User userIdByAccount = userMapper.userIdByAccount(user.getUsername());

        if (userIdByAccount == null) {
            // 处理用户不存在的情况
            throw new NoSuchElementException("用户不存在");
        }

        // 创建新的 User 对象用于更新
        User updatedUser = new User();
        updatedUser.setId(userIdByAccount.getId()); // 假设 User 类中有 id 字段
        updatedUser.setUsername(user.getUsername());
        updatedUser.setPassword(user.getPassword());

        // 更新用户表
        return userMapper.update(updatedUser);
    }

    @Override
    public List<Map> getEmployeeList() {
        return baseMapper.getEmployeeList();
    }


//    @Transactional
//    @Override
//    public int update(Employee entity) {
//        // 获取用户对象
//        User user = entity.getUser();
//        // 通过账户名获取用户ID
//        User user1 = userMapper.userIdByAccount(user.getAccount());
//        // 更新用户表
//        user1.setAccount(user.getAccount());
//        user1.setPassword(user.getPassword());
//        userMapper.update(user1);
//        // 更新员工表
//        int employeUpdated = employeeMapper.update(entity);
//        // 检查是否两个操作都成功
//        if (employeUpdated > 0) {
//            return employeUpdated;
//        }
//        // 如果任何一个操作失败，回滚事务
//        throw new RuntimeException("更新员工信息失败，请稍后再试。");
//    }
}
